热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

臣妾|升序_iOS最易用的数据库工具类`XWDatabase`开源

篇首语:本文由编程笔记#小编为大家整理,主要介绍了iOS-最易用的数据库工具类`XWDatabase`开源相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了iOS - 最易用的数据库工具类 `XWDatabase` 开源相关的知识,希望对你有一定的参考价值。



ios - 最易用的数据库工具类 XWDatabase 开源


XWDatabase 将数据库操作简化到难以想象的程度,你甚至不需要知道数据库的存在,当然更不需要写 SQL 语句,你只需要直接操作模型即可对模型进行增删改查的操作,她会根据模型动态在数据库中创建以当前模型类名为名称的数据库表,当然你也可以自定义表名;她会根据模型的成员变量和成员变量的类型动态进行字段的设计,有多少成员变量,表中自然就会有多少字段与其对应,当然,你也可以忽略其中的某些你不想存储的成员变量,也可以自定义字段的名称;如果哪天模型的字段变化了,她会自动进行表中原有字段的更新,而且无论原表中有多少数据,都会一条不落的迁移到新表中;她的API简单到只有一行代码,你无需关注数据库的开启和关闭,一行代码实现增删改查和数据迁移; 你甚至可以在任何线程中调用她的API,她一定是线程安全的,不会出现多线程访问同一个数据库和死锁的问题;数据操作是耗时操作,所以你无需手动开启异步线程操作数据库操作,她会统一在一个保活的异步线程中执行;她支持存储常见的数据类型(int,long,signed,float,double,NSInteger,CGFloat,BOOL,NSString,NSMutableString,NSNumber,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,UIImage,NSDate,NSURL,NSRange,CGRect,CGSize,CGPoint,自定义对象 等的存储.); 她还对二进制文件的存储做了优化,比如同一张图片表中所有数据都持有这张图片对象,她在数据库中只会有一份拷贝,竭尽她所能优化存储空间。 笔锋一转,V1.0 版本会存在很多不足,希望各位前辈和大牛多多指正,多提 issues

下面简述一下此库的一些设计思路和使用方法


使用


一、增


1.保存一个模型

- (void)saveOnePerson
XWPerson *person = [XWPerson testPerson:2];
[XWDatabase saveModel:person completion:^(BOOL isSuccess)
];

实例化一个对象, 调用 saveModel 方法。


2.保存多个模型

- (void)saveModels
NSMutableArray *persons = [[NSMutableArray alloc] init];
for (int i &#61; 0; i <1000; i&#43;&#43;)
[persons addObject:[XWPerson testPerson:i]];

[XWDatabase saveModels:persons completion:^(BOOL isSuccess)

];

实例化一堆对象&#xff0c; 调用 saveModels 方法。


二、删


1.删除一个模型

- (void)deleteModel
XWPerson *person &#61; [XWPerson new];
person.cardID &#61; &#64;"1"; /// 指定想删除的主键&#xff08;或联合主键&#xff09;
[XWDatabase deleteModel:person completion:^(BOOL isSuccess)

];

实例化一个对象&#xff0c;为主键赋值&#xff08;得知道删的是哪个&#xff0c;让她猜&#xff0c;臣妾做不到&#xff09;&#xff0c; 调用 deleteModel 方法。


2.删除此模型存储的所有数据

- (void)clearModel
[XWDatabase clearModel:XWPerson.class completion:^(BOOL isSuccess)
];

调用 clearModel 方法&#xff0c;传入想删除的模型类


3.选择性删除此模型存储的数据

/// 删除 age > 50 的数据
- (void)clearModel
[XWDatabase clearModel:XWPerson.class condition:&#64;"age > &#39;50&#39;" completion:^(BOOL isSuccess)

];

调用 clearModel 方法&#xff0c;传入想删除的模型类和条件


三、改


1.更新某模型某个成员变量 &#xff08;选择性更新&#xff09;

/// 改名
- (void)updateModel
XWPerson *person &#61; [XWPerson new];
person.cardID &#61; &#64;"2";
person.name &#61; &#64;"新名字";

/// 自定义成员变量更新
[XWDatabase updateModel:person updatePropertys:&#64;[&#64;"name"] completion:^(BOOL isSuccess)

];

实例化一个对象&#xff0c;为主键和有变化的成员变量赋值&#xff0c; 调用 updateModel 方法&#xff0c;传入想更新的成员变量名称。


2.更新某模型所有数据 &#xff08;全量更新&#xff09;

/// 根据传入的模型整体更新
- (void)updateModel
XWPerson *person &#61; [XWPerson new];
person.cardID &#61; &#64;"2";
person.name &#61; &#64;"新名字";
person.girls &#61; &#64;[&#64;"小妹",&#64;"校花",&#64;"小baby"];

/// 整个模型更新
[XWDatabase saveModel:person completion:^(BOOL isSuccess)

];

实例化一个对象&#xff0c; 调用 updateModel 方法&#xff0c;传入想更新的模型。


四、查


1.根据主键查询模型

- (void)getOnePerson
XWPerson *person &#61; [XWPerson new];
person.cardID &#61; &#64;"81";
[XWDatabase getModel:person completion:^(XWPerson * obj)

];

实例化一个对象&#xff0c;为主键赋值&#xff0c; 调用 getModel 方法。


2.查询数据库中所有该模型存储的数据

- (void)getModels
[XWDatabase getModels:XWPerson.class completion:^(NSArray * _Nullable objs)


];

调用 getModels 方法&#xff0c;传入模型类


3.查询数据库中所有该模型存储的数据 - 按某成员变量排序

/// 获取数据库中所有该模型存储的数据 - 按 age 字段降序排列
- (void)getModelsSortAge
[XWDatabase getModels:XWPerson.class sortColumn:&#64;"age" isOrderDesc:YES completion:^(NSArray * _Nullable objs)

];

调用 getModels 方法&#xff0c;传入模型类和要排序的字段


4.查询数据库中所有该模型存储的数据 - 自定义查询条件

/// 获取数据库中所有该模型存储的数据 - 自定义查找条件 (例如模糊查询 name 含 学伟 的数据)
- (void)getModelsCondition
[XWDatabase getModels:XWPerson.class condition:&#64;"name like &#39;%学伟&#39;" completion:^(NSArray * _Nullable objs)

];

调用 getModels 方法&#xff0c;传入模型类和查询的条件


5.查询数据库中所有该模型存储的数据 - 自定义查询条件并且可按照某字段排序

/// 获取数据库中所有该模型存储的数据 - 自定义查找条件可排序 (例如模糊查询 name 含 学伟 的数据, 并且按 age 升序排序)
- (void)getModelsConditionSort
[XWDatabase getModels:XWPerson.class sortColumn:&#64;"age" isOrderDesc:NO condition:&#64;"name like &#39;%学伟&#39;" completion:^(NSArray * _Nullable objs)

];

调用 getModels 方法&#xff0c;传入模型类和查询的条件和排序的成员变量名称


五、数据迁移


模型中成员变量发生变化&#xff0c;动态进行数据迁移

&#43; (void)initialize
&#43;
[XWDatabase updateTable:self completion:^(BOOL isSuccess)

];

在模型对象的 initialize 方法中 调用 updateTable 方法。之所以在 initialize 方法中调用是保证用户无感知的情况下在操作此模型进行数据操作时自动更新。

以上就是 XWDatabase V1.0 版本的所有功能示例。谢谢&#xff01;

下面介绍一些使用规范和功能扩展。


六 、XWDatabaseModelProtocol 协议

/**
主键 不可更改/唯一性

&#64;return 主键的属性名
*/
&#43; (NSString *)xw_primaryKey;
/**
联合主键成员变量数组 (多个属性共同定义主键) - 优先级大于 &#39;xw_primaryKey&#39;
&#64;return 联合主键成员变量数组
*/
&#43; (NSArray *)xw_unionPrimaryKey;
/**
自定义对象映射 (key: 成员变量名称 value: 对象类)
&#64;return 自定义对象映射
*/
&#43; (NSDictionary *)xw_customModelMapping;
/**
忽略不保存数据库的属性

&#64;return 忽略的属性名数组
*/
&#43; (NSSet *)xw_ignoreColumnNames;
/**
自定义字段名映射表 (默认成员变量即变量名, 可自定义字段名 key: 成员变量(属性)名称 value: 自定义数据库表字段名)
&#64;return 自定义字段名映射表
*/
&#43; (NSDictionary *)xw_customColumnMapping;
/**
自定义表名 (默认属性类名)
&#64;return 自定义表名
*/
&#43; (NSString *)xw_customTableName;

当模型遵守 XWDatabaseModelProtocol 协议并选择性实现其中某些方法时她便会更好的为您服务。当然 主键 xw_primaryKey&#xff08;或联合主键 xw_unionPrimaryKey &#xff09;是查询和更新必须要实现的方法。

如果模型中成员变量存在其他的自定义模型&#xff0c;那其他的自定义模型需要遵从 NSCoding 协议并实现 initWithCoderencodeWithCoder 方法。 XWDatabase 中的 NSObject&#43;XWModel 提供了一个宏可以快速使自定义对象具备归解档的功能 XWCodingImplementation


设计思路


  1. 根据 runtime 获取对象成员变量名称和类型生成 建表 SQL 语句
  2. 根据当前对象成员变量名称和原有数据库表中字段排序后进行比较&#xff0c;有差异进行数据迁移
  3. 根据模型动态生成 SQL 语句
  4. 利用事务进行大数据量的操作
  5. 创建一个保活的子线程&#xff08;使异步线程的 Runloop 保持活跃&#xff09;进行数据库操作&#xff0c;使用主线程队列保证数据操作的同步
  6. 数据库底层封装自 FMDB
  7. 创建一个单独存放图片二进制的库存储二进制文件。真实表中存储 二进制 文件的 hash 值已达到数据重用。

此库支持 CocoaPod 集成:

pod &#39;XWDatabase&#39;

项目源码开源在 GitHub 中&#xff0c;链接&#xff1a; XWDatabase

作者&#xff1a;极客学伟
博客&#xff1a;https://blog.csdn.net/qxuewei/


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
author-avatar
晨曦--雨荷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有